//
// Created by Administrator on 2021/6/10.
//

//在柠檬水摊上，每一杯柠檬水的售价为5美元。
//
//顾客排队购买你的产品，（按账单 bills 支付的顺序）一次购买一杯。
//
//每位顾客只买一杯柠檬水，然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零，也就是说净交易是每位顾客向你支付 5 美元。
//
//注意，一开始你手头没有任何零钱。
//
//如果你能给每位顾客正确找零，返回true， false。


#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
    bool lemonadeChange(vector<int> &bills) {
        /**
         * 优先把大面额的钞票找给顾客
         */
        int five = 0, ten = 0;
        for (auto &bill:bills) {
            switch (bill) {
                case 5:
                    ++five;
                    break;
                case 10:
                    if (five == 0) return false;
                    --five;
                    ++ten;
                    break;
                case 20:
                    // 可以10 +5 或者 5 + 5+ 5
                    if (five >= 1 and ten >= 1) {
                        --five;
                        --ten;
                        break;
                    } else if (five >= 3) {
                        five -= 3;
                        break;
                    } else return false;
                default:
                    continue;
            }
        }
        return true;
    }
};

int main() {
    vector<int> bills{5, 5, 10, 10, 20};
    Solution sol;
    cout << sol.lemonadeChange(bills) << endl;
    return 0;
}